import edu.ucdavis.jr.*;
import edu.ucdavis.jr.jrx.*;

public class BucketSort {
	int processes; // number of processes
	int[] array;
	int[] buckets;
	int bucketSize;
	int counter = 0;
	int S; // strip size
	op void bag(int);
	
	public BucketSort(int processes) {
		this.processes = processes;
	}

	sem done;
	
	
	public void compute(int[] array, int[] buckets, int bucketSize) {
		this.array = array;
		this.buckets = buckets;
		this.bucketSize = bucketSize;
		S = bucketSize/processes;
		
		for(int p=0; p< processes; p++){
			send strip(p);
		}
		
		// wait for all to complete
		for(int p=0; p< processes; p++){
			P(done);
		}
	}

	private op void strip( int p){
		final int R = p * S;
		for(int i = R; i < (R+S); i++){
			for(int j = 0; j < buckets[i]; j++) {
				if( counter < array.length ){
					array[counter] = i;
					counter++;
//					System.out.println("inside strip for loop. Counter = " + counter);
				}
			}
//			counter++;
//			System.out.println("inside strip for loop. Counter = " + counter);
		}
		V(done);
	}
	
//	public void compute(int[] array, int[] buckets, int bucketSize) {
//	this.array = array;
//	this.buckets = buckets;
//	this.bucketSize = bucketSize;
//	
//	// Initialize bag of tasks.
//	for(int r=0; r< bucketSize; r++){
//		send bag(r);
//	}
//	
//	// Start worker processes.
//	for(int p=0; p< processes; p++){
//		send worker();
//	}
//	
//	// Wait for all to complete.
//	for(int p=0; p< processes; p++){
//		P(done);
//	}
//}
//
//private op void worker(){
//	while( true) {
//		inni void bag(int i){
//			
//			for(int j = 0; j < buckets[i]; j++) {
//				if( counter < array.length ){
//					array[counter] = i;
//					counter++;
//				}
//			}
//		}
//		[] else {
//			break;
//		}
//	}
//
//	V(done);
//}

	
}
